package clases.busquedalocal;

import interfaces.HeuristicaBusquedaLocal;
import clases.CasoDePrueba;
import clases.Helper;
import clases.ResultadoCasoDePruebaArrayBinarios;
import clases.Tupla;

import java.io.IOException;
import java.util.ArrayList;



public class BusquedaLocalDosVariables implements HeuristicaBusquedaLocal {

	static ArrayList<CasoDePrueba> casosDePrueba = new ArrayList<CasoDePrueba>();
	
	public static void main(String[] args) throws IOException {
		BusquedaLocalDosVariables busqueda = new BusquedaLocalDosVariables();
		busqueda.doit();
	}
	
	public void doit() throws IOException {
		Helper.leerArchivoBusquedaLocal(this,"TP3BusquedaLocal.out");
	}

	public ResultadoCasoDePruebaArrayBinarios dameLaSolucionDelCaso(CasoDePrueba caso, ResultadoCasoDePruebaArrayBinarios constructiva) {
		
		int[][]matrizClausulas = Helper.llenarPositivosYNegativosMatriz(caso.clausulas, caso.clausulas.size(), constructiva.binarioQueHaceMaxLasClausulas.length);
		int[] contadorVariablesEnTrueMax = Helper.contarValoresVerdaderos(matrizClausulas,constructiva.binarioQueHaceMaxLasClausulas,constructiva.binarioQueHaceMaxLasClausulas.length);
		
		
		ResultadoCasoDePruebaArrayBinarios solucionMax = constructiva;
		
		int[] solucionBusquedaLocal = solucionMax.binarioQueHaceMaxLasClausulas.clone();
		
		Tupla solucionesNuevas = new Tupla();
		
		boolean hiceVerdaderasTodasLasClausulas = false;
		
		boolean resetieContadores = false;
		
		int j = 0;
		
		for (int i = 0; i < solucionBusquedaLocal.length && !hiceVerdaderasTodasLasClausulas; i++) {
			j = 0;
			while(j < solucionBusquedaLocal.length && !hiceVerdaderasTodasLasClausulas) {
				
				solucionesNuevas = Helper.chequear2Variables(solucionMax,i,j,caso,contadorVariablesEnTrueMax,matrizClausulas);
				if(solucionesNuevas.clausulasSatisfechas > solucionMax.clausulasMax) {
					solucionMax.clausulasMax = solucionesNuevas.clausulasSatisfechas;
					solucionMax.binarioQueHaceMaxLasClausulas = solucionesNuevas.binarion;
					solucionMax.listaClausulasSatisfechas = solucionesNuevas.listaClausulas;
					contadorVariablesEnTrueMax = solucionesNuevas.contadorVariablesEnTrue.clone();
					//Reseteo los contadores, para volver a centrar en la nueva solucion y explorar toda la vecindad
					i = 0; j= 0;
					resetieContadores = true;
					
					if (caso.c == solucionMax.clausulasMax) {
						hiceVerdaderasTodasLasClausulas = true;
					}
				}
				
				if(!resetieContadores) {
					j++;
				}
				
				resetieContadores = false;
				
			}
		}
		
		return solucionMax;
	}
}
